package dcore.id;

import lombok.Getter;
import lombok.Setter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

/**
 * 根据Snowflake算法原理，整个ID由时间码+机器码+序列号组成。<br/>
 * 时间码为毫秒时间戳，共41位，大约可用69年。<br/>
 * 机器码共10位，最大可用1<<10=1024.<br/>
 * 序列号共12位序号码，最大可用1<<12= 4096;一台服务器每秒可产生4096*1000=409.6万IP。<br/>
 * 因为大部分情况下，并没有这么大的并发量，所以我们对算法稍微做了一点改动：<br/>
 * 1位符号位，永远为0；<br/>
 * 32位时间码，存储秒钟，可以自行设定一个开始时间，计算两者之间的秒数即可，可用136年；<br/>
 * 31位为机器码+序列号组成，可根据实际情况配置，如单机高访问量，集群数量少，可以适当增加序列号位数，减少机器码位数<br/>
 */
@Getter
@Setter
@Configuration
public class IdConfiguration {
    /**
     * 机器码+序号码的总位数，固定为31位
     */
    private final int stampBit = 31;
    /**
     * 最小时间戳2018-01-01 00:00:00
     * 20240701:1404144000
     */
    @Value("${min-timestamp:1514764800}")
    private long minTimestamp=1514764800L;
    /**
     * 序号码位数，必须大于0
     */
    @Value("${sequence-bit:15}")
    private int sequenceBit=15;
    /**
     * 最大序号
     */
    private final int sequenceMask = ~(-1 << sequenceBit);
    /**
     * 最大机器码
     */
    private final int machineMask = ~(-1<<(stampBit-sequenceBit));
}
